//package com.qing.picture.utils;
//
//import cn.hutool.core.io.FileUtil;
//import cn.hutool.core.lang.UUID;
//import cn.hutool.core.util.NumberUtil;
//import cn.hutool.core.util.StrUtil;
//import cn.hutool.http.HttpResponse;
//import cn.hutool.http.HttpStatus;
//import cn.hutool.http.HttpUtil;
//import cn.hutool.http.Method;
//import cn.hutool.json.JSONObject;
//import com.aliyun.oss.OSS;
//import com.aliyun.oss.OSSClientBuilder;
//import com.aliyun.oss.model.ListObjectsRequest;
//import com.aliyun.oss.model.OSSObject;
//import com.aliyun.oss.model.ObjectListing;
//import com.qing.picture.exception.BusinessException;
//import com.qing.picture.exception.ErrorCode;
//import com.qing.picture.exception.ThrowUtils;
//import com.qing.picture.model.dto.file.UploadPictureResult;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Component;
//import org.springframework.web.multipart.MultipartFile;
//
//import java.io.File;
//import java.io.IOException;
//import java.io.InputStream;
//import java.net.MalformedURLException;
//import java.net.URL;
//import java.text.SimpleDateFormat;
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.Date;
//import java.util.List;
//
//@Component
//public class AliyunOssUtil {
//
//    @Value("${aliyun.oss.endpoint}")
//    private String endpoint;
//
//    @Value("${aliyun.oss.accessKeyId}")
//    private String accessKeyId;
//
//    @Value("${aliyun.oss.accessKeySecret}")
//    private String accessKeySecret;
//
//    @Value("${aliyun.oss.bucketName}")
//    private String bucketName;
//
//
//    /**
//     * 获取当前日期的文件夹路径
//     * @return 当前日期的文件夹路径
//     */
//    private String getCurrentDateFolder() {
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//        return sdf.format(new Date()) + "/";
//    }
//    /**
//     * 校验文件
//     *
//     * @param multipartFile multipart 文件
//     */
//    public void validPicture(MultipartFile multipartFile) {
//        ThrowUtils.throwIf(multipartFile == null, ErrorCode.PARAMS_ERROR, "文件不能为空");
//        // 1. 校验文件大小
//        long fileSize = multipartFile.getSize();
//        final long ONE_M = 1024 * 1024L;
//        ThrowUtils.throwIf(fileSize > 2 * ONE_M, ErrorCode.PARAMS_ERROR, "文件大小不能超过 2M");
//        // 2. 校验文件后缀
//        String fileSuffix = FileUtil.getSuffix(multipartFile.getOriginalFilename());
//        // 允许上传的文件后缀
//        final List<String> ALLOW_FORMAT_LIST = Arrays.asList("jpeg", "jpg", "png", "webp");
//        ThrowUtils.throwIf(!ALLOW_FORMAT_LIST.contains(fileSuffix), ErrorCode.PARAMS_ERROR, "文件类型错误");
//    }
//
//    private String validPicture(String fileUrl) {
//        ThrowUtils.throwIf(StrUtil.isBlank(fileUrl), ErrorCode.PARAMS_ERROR, "文件地址不能为空");
//
//        try {
//            // 1. 验证 URL 格式
//            new URL(fileUrl); // 验证是否是合法的 URL
//        } catch (MalformedURLException e) {
//            throw new BusinessException(ErrorCode.PARAMS_ERROR, "文件地址格式不正确");
//        }
//
//        // 2. 校验 URL 协议
//        ThrowUtils.throwIf(!(fileUrl.startsWith("http://") || fileUrl.startsWith("https://")),
//                ErrorCode.PARAMS_ERROR, "仅支持 HTTP 或 HTTPS 协议的文件地址");
//
//        // 3. 发送 HEAD 请求以验证文件是否存在
//        HttpResponse response = null;
//        try {
//            response = HttpUtil.createRequest(Method.HEAD, fileUrl).execute();
//            // 未正常返回，无需执行其他判断
//            if (response.getStatus() != HttpStatus.HTTP_OK) {
//                return StrUtil.EMPTY;
//            }
//            // 4. 校验文件类型
//            String contentType = response.header("Content-Type");
//            if (StrUtil.isNotBlank(contentType)) {
//                // 允许的图片类型
//                final List<String> ALLOW_CONTENT_TYPES = Arrays.asList("image/jpeg", "image/jpg", "image/png", "image/webp");
//                ThrowUtils.throwIf(!ALLOW_CONTENT_TYPES.contains(contentType.toLowerCase()),
//                        ErrorCode.PARAMS_ERROR, "文件类型错误");
//            }
//            // 5. 校验文件大小
//            String contentLengthStr = response.header("Content-Length");
//            if (StrUtil.isNotBlank(contentLengthStr)) {
//                try {
//                    long contentLength = Long.parseLong(contentLengthStr);
//                    final long TWO_MB = 2 * 1024 * 1024L; // 限制文件大小为 2MB
//                    ThrowUtils.throwIf(contentLength > TWO_MB, ErrorCode.PARAMS_ERROR, "文件大小不能超过 2M");
//                } catch (NumberFormatException e) {
//                    throw new BusinessException(ErrorCode.PARAMS_ERROR, "文件大小格式错误");
//                }
//            }
//            return contentType.substring(contentType.indexOf("/") + 1);
//        } finally {
//            if (response != null) {
//                response.close();
//            }
//        }
//    }
//
//    /**
//     * 上传文件
//     * @param file 要上传的文件
//     * @return 文件的访问 URL
//     */
//    public UploadPictureResult uploadFile(MultipartFile file) {
//
//        // 校验图片
//        validPicture(file);
//
//        //生成文件名
//        String folder = getCurrentDateFolder();
//        String uuid = UUID.randomUUID().toString();
//
//        //原始文件名
//        String originalFilename = file.getOriginalFilename();//abc.jpg
//        //获取文件后缀名，这里不能split，因为split里不能根据“.”分割
//        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//        //新的文件名
//        String objectName = folder + uuid +suffix;
//        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//        try {
//
//            InputStream inputStream = file.getInputStream();
//            ossClient.putObject(bucketName, objectName, inputStream);
//
//
//            // 设置URL过期时间为100年，默认这里是int型，转换为long型即可
//            Date expiration = new Date(new Date().getTime() + 3600L * 1000 * 24 * 365 * 100);
//            URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
//            if (url != null) {
//                String host = url.toString().substring(0,url.toString().indexOf("?"));
//                String resurl = host+"?x-oss-process=image/info";
//                String   strimg =  HttpUtil.get(resurl);
//                // 使用 Hutool 的 JSON 库解析响应
//                JSONObject jsonObject = new JSONObject(strimg);
//                UploadPictureResult uploadPictureResult = new UploadPictureResult();
//
//                int picWidth = jsonObject.getByPath("ImageWidth.value", Integer.class);
//                int picHeight = jsonObject.getByPath("ImageHeight.value", Integer.class);
//                double picScale = NumberUtil.round(picWidth * 1.0 / picHeight, 2).doubleValue();
//
//                uploadPictureResult.setPicName(FileUtil.mainName(originalFilename));
//                uploadPictureResult.setPicWidth(picWidth);
//                uploadPictureResult.setPicHeight(picHeight);
//                uploadPictureResult.setPicScale(picScale);
//                uploadPictureResult.setPicFormat(jsonObject.getByPath("Format.value", String.class));
//                uploadPictureResult.setPicSize(Long.parseLong(jsonObject.getByPath("FileSize.value", String.class)));
//                uploadPictureResult.setUrl(host);
//                return uploadPictureResult;
//            }
//        } catch (Exception e) {
//            throw new BusinessException(ErrorCode.OPERATION_ERROR, "上传文件失败");
//        } finally {
//            ossClient.shutdown();
//        }
//        return null;
//    }
//
//    /**
//     * 根据url上传文件
//     * @param fileUrl 要上传的文件的url
//     * @return 文件的访问 URL
//     */
//
//    public UploadPictureResult uploadPictureByUrl(String fileUrl) {
//        // 校验图片
//       String suffix = validPicture(fileUrl);
//
//        //生成文件名
//        String folder = getCurrentDateFolder();
//        String uuid = UUID.randomUUID().toString();
//
//        //新的文件名
//        String objectName = folder + uuid + "." + suffix;
//        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//        File file = null;
//        try {
//
//            //创建临时文件
//            file = File.createTempFile(objectName, null);
//            //下载图片
//            HttpUtil.downloadFile(fileUrl, file);
//            ossClient.putObject(bucketName, objectName, file);
//
//
//            // 设置URL过期时间为100年，默认这里是int型，转换为long型即可
//            Date expiration = new Date(new Date().getTime() + 3600L * 1000 * 24 * 365 * 100);
//            URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
//            if (url != null) {
//                String host = url.toString().substring(0,url.toString().indexOf("?"));
//                String resurl = host+"?x-oss-process=image/info";
//                String   strimg =  HttpUtil.get(resurl);
//                // 使用 Hutool 的 JSON 库解析响应
//                JSONObject jsonObject = new JSONObject(strimg);
//                UploadPictureResult uploadPictureResult = new UploadPictureResult();
//
//                int picWidth = jsonObject.getByPath("ImageWidth.value", Integer.class);
//                int picHeight = jsonObject.getByPath("ImageHeight.value", Integer.class);
//                double picScale = NumberUtil.round(picWidth * 1.0 / picHeight, 2).doubleValue();
//
//                uploadPictureResult.setPicName(FileUtil.mainName(uuid));
//                uploadPictureResult.setPicWidth(picWidth);
//                uploadPictureResult.setPicHeight(picHeight);
//                uploadPictureResult.setPicScale(picScale);
//                uploadPictureResult.setPicFormat(jsonObject.getByPath("Format.value", String.class));
//                uploadPictureResult.setPicSize(Long.parseLong(jsonObject.getByPath("FileSize.value", String.class)));
//                uploadPictureResult.setUrl(host);
//                return uploadPictureResult;
//            }
//        } catch (Exception e) {
//            throw new BusinessException(ErrorCode.OPERATION_ERROR, "上传文件失败");
//        } finally {
//            ossClient.shutdown();
//        }
//        return null;
//    }
//
//    /**
//     * 批量上传文件
//     * @param files 要上传的文件列表
//     * @return 文件的访问 URL 列表
//     */
//    public List<String> uploadFiles(List<MultipartFile> files) {
//        List<String> urls = new ArrayList<>();
//        String folder = getCurrentDateFolder();
//        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//        try {
//            for (MultipartFile file : files) {
//                String uuid = UUID.randomUUID().toString();
//                String objectName = folder + uuid;
//                InputStream inputStream = file.getInputStream();
//                ossClient.putObject(bucketName, objectName, inputStream);
//                // 设置URL过期时间为100年，默认这里是int型，转换为long型即可
//                Date expiration = new Date(new Date().getTime() + 3600L * 1000 * 24 * 365 * 100);
//                URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
//                if (url != null) {
//                    urls.add(url.toString());
//                }
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        } finally {
//            ossClient.shutdown();
//        }
//        return urls;
//    }
//
//    /**
//     * 删除文件
//     * @param objectName 要删除的文件名
//     */
//    public void deleteFile(String objectName) {
//        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//        try {
//            ossClient.deleteObject(bucketName, objectName);
//        } finally {
//            ossClient.shutdown();
//        }
//    }
//    /**
//     * 批量删除文件
//     * @param objectNames 要删除的文件名列表
//     */
//    public void deleteFiles(List<String> objectNames) {
//        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//        try {
//            for (String objectName : objectNames) {
//                ossClient.deleteObject(bucketName, objectName);
//            }
//        } finally {
//            ossClient.shutdown();
//        }
//    }
//    /**
//     * 下载文件
//     * @param objectName 要下载的文件名
//     * @return 文件对象
//     */
//    public OSSObject downloadFile(String objectName) {
//        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//        try {
//            return ossClient.getObject(bucketName, objectName);
//        } finally {
//            ossClient.shutdown();
//        }
//    }
//
//    /**
//     * 列举文件
//     * @param prefix 文件名前缀
//     * @return 文件列表
//     */
//    public ObjectListing listFiles(String prefix) {
//        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//        try {
//            ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
//            listObjectsRequest.setPrefix(prefix);
//            return ossClient.listObjects(listObjectsRequest);
//        } finally {
//            ossClient.shutdown();
//        }
//    }
//
//
//}